/*******************************************************************************
 * Copyright (c) 2012-2017 Codenvy, S.A.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   Codenvy, S.A. - initial API and implementation
 *******************************************************************************/
package org.eclipse.che.plugin.docker.client;

import com.sun.jna.Library;
import com.sun.jna.Structure;
import com.sun.jna.ptr.LongByReference;

import java.util.Arrays;
import java.util.List;

/**
 * @author andrew00x
 */
// C language functions
public interface CLibrary extends Library {
    int AF_UNIX     = 1; // Defined in 'sys/socket.h'
    int SOCK_STREAM = 1; // Defined in 'sys/socket.h'

    // Defined in 'unix.h', see http://man7.org/linux/man-pages/man7/unix.7.html
    class SockAddrUn extends Structure {
        public static final int UNIX_PATH_MAX = 108;

        public short  sun_family;
        public byte[] sun_path;

        public SockAddrUn(String path) {
            byte[] pathBytes = path.getBytes();
            if (pathBytes.length > UNIX_PATH_MAX) {
                throw new IllegalArgumentException(String.format("Path '%s' is too long. ", path));
            }
            sun_family = AF_UNIX;
            sun_path = new byte[pathBytes.length + 1];
            System.arraycopy(pathBytes, 0, sun_path, 0, Math.min(sun_path.length - 1, pathBytes.length));
            allocateMemory();
        }

        @Override
        protected List getFieldOrder() {
            return Arrays.asList("sun_family", "sun_path");
        }
    }

    int socket(int domain, int type, int protocol);

    int connect(int fd, SockAddrUn sock_addr, int addr_len);

    int send(int fd, byte[] buffer, int count, int flags);

    int recv(int fd, byte[] buffer, int count, int flags);

    int close(int fd);

    String strerror(int errno);

    int write(int fd, byte[] buff, int count);

    int read(int fd, byte[] buf, int count);

    int eventfd(int initval, int flag);

    int eventfd_read(int fd, LongByReference val);

    int open(String path, int mode);

    int O_RDONLY = 0x00;
    int O_WRONLY = 0x01;
}
